#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <cassert>
#include <memory.h>

typedef int HeapDataType;
typedef struct Heap {
	HeapDataType* _heap;
	int _size;
	int _capacity;
}Heap;

void Swap(HeapDataType* pnum1, HeapDataType* pnum2);
// 向下调整法: 左右子树都是堆
void AdjustDown(HeapDataType* array, int n, int root);
void AdjustUp(HeapDataType* array, int n, int child);
void HeapInit(Heap* pheap, HeapDataType* array, int n);
void HeapSort(HeapDataType* array, int n); // 堆排序: O(N * LogN)
void HeapPrint(HeapDataType* pheap, int size);
void HeapDestory(Heap* pheap);
void HeapPush(Heap* pheap, HeapDataType value);
void HeapPop(Heap* pheap);
HeapDataType HeapTop(Heap* pheap);